/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * MainFrame.java
 *
 * Created on 18/06/2009, 16:58:37
 */
package compilador.GUI;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Insets;
import java.awt.Toolkit;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.lang.String;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import javax.swing.JScrollBar;
import javax.swing.JScrollPane;
import javax.swing.table.DefaultTableModel;
import javax.swing.text.StyleConstants;
import javax.swing.text.StyledDocument;
import pacoteAnalisadorLexico.AnalisadorLexico;
import pacoteAnalisadorSintatico.SintaticoGeral;
import pacoteAutomato.Erro;
import pacoteAutomato.Token;
import pacoteScanner.Scanner;

/**
 *
 * @author Igor
 */
public class MainFrame extends javax.swing.JFrame {

    TelaSaida telinha;
    PainelCodigo painel;
    File fonte;
    String textoBufferizado = "";
    int contador = 0;
    ArrayList<Token> tokensSintatico;

    /** Creates new form MainFrame */
    public MainFrame() {
        initComponents();
        setarFullScreen(); //seta painel principal em tela cheia
        ajustaAmbiente(); //ajusta componentes visuais do programa
        telinha.setVisible(false);

    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        painelMenus = new javax.swing.JPanel();
        jToolBar1 = new javax.swing.JToolBar();
        botaoNovo = new javax.swing.JButton();
        botaoAbrir = new javax.swing.JButton();
        botaoTabelaSimbolos = new javax.swing.JButton();
        botaoCopiar = new javax.swing.JButton();
        botaoColar = new javax.swing.JButton();
        botaoRecortar = new javax.swing.JButton();
        botaoRun = new javax.swing.JButton();
        botaoParar = new javax.swing.JButton();
        botaoComentar = new javax.swing.JButton();
        jToolBar2 = new javax.swing.JToolBar();
        jMenuBar1 = new javax.swing.JMenuBar();
        jMenu1 = new javax.swing.JMenu();
        sair = new javax.swing.JMenuItem();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        painelMenus.setBackground(new java.awt.Color(218, 218, 240));
        painelMenus.setBorder(javax.swing.BorderFactory.createEtchedBorder());

        jToolBar1.setBackground(new java.awt.Color(218, 218, 240));
        jToolBar1.setBorder(javax.swing.BorderFactory.createEtchedBorder());
        jToolBar1.setFloatable(false);
        jToolBar1.setRollover(true);
        jToolBar1.setBorderPainted(false);

        botaoNovo.setBackground(new java.awt.Color(218, 218, 240));
        botaoNovo.setIcon(new javax.swing.ImageIcon(getClass().getResource("/compilador/resources/new_page.png"))); // NOI18N
        botaoNovo.setToolTipText("Limpa o documento atual gerando um novo documento em branco");
        botaoNovo.setBorderPainted(false);
        botaoNovo.setFocusable(false);
        botaoNovo.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        botaoNovo.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        botaoNovo.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botaoNovoActionPerformed(evt);
            }
        });
        jToolBar1.add(botaoNovo);

        botaoAbrir.setBackground(new java.awt.Color(218, 218, 240));
        botaoAbrir.setIcon(new javax.swing.ImageIcon(getClass().getResource("/compilador/resources/folder_add.png"))); // NOI18N
        botaoAbrir.setToolTipText("Abre um arquivo de extensão .txt e toma como arquivo fonte");
        botaoAbrir.setBorderPainted(false);
        botaoAbrir.setFocusable(false);
        botaoAbrir.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        botaoAbrir.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        botaoAbrir.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botaoAbrirActionPerformed(evt);
            }
        });
        jToolBar1.add(botaoAbrir);

        botaoTabelaSimbolos.setBackground(new java.awt.Color(218, 218, 240));
        botaoTabelaSimbolos.setIcon(new javax.swing.ImageIcon(getClass().getResource("/compilador/resources/window.png"))); // NOI18N
        botaoTabelaSimbolos.setBorderPainted(false);
        botaoTabelaSimbolos.setFocusable(false);
        botaoTabelaSimbolos.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        botaoTabelaSimbolos.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        botaoTabelaSimbolos.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botaoTabelaSimbolosActionPerformed(evt);
            }
        });
        jToolBar1.add(botaoTabelaSimbolos);

        botaoCopiar.setBackground(new java.awt.Color(218, 218, 240));
        botaoCopiar.setIcon(new javax.swing.ImageIcon(getClass().getResource("/compilador/resources/page_edit.png"))); // NOI18N
        botaoCopiar.setToolTipText("Copiar");
        botaoCopiar.setBorderPainted(false);
        botaoCopiar.setFocusable(false);
        botaoCopiar.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        botaoCopiar.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        botaoCopiar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botaoCopiarActionPerformed(evt);
            }
        });
        jToolBar1.add(botaoCopiar);

        botaoColar.setBackground(new java.awt.Color(218, 218, 240));
        botaoColar.setIcon(new javax.swing.ImageIcon(getClass().getResource("/compilador/resources/office2_32.png"))); // NOI18N
        botaoColar.setToolTipText("Colar");
        botaoColar.setBorderPainted(false);
        botaoColar.setFocusable(false);
        botaoColar.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        botaoColar.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        botaoColar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botaoColarActionPerformed(evt);
            }
        });
        jToolBar1.add(botaoColar);

        botaoRecortar.setBackground(new java.awt.Color(218, 218, 240));
        botaoRecortar.setIcon(new javax.swing.ImageIcon(getClass().getResource("/compilador/resources/Scissors-32x32.png"))); // NOI18N
        botaoRecortar.setToolTipText("Recortar");
        botaoRecortar.setBorderPainted(false);
        botaoRecortar.setFocusable(false);
        botaoRecortar.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        botaoRecortar.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        botaoRecortar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botaoRecortarActionPerformed(evt);
            }
        });
        jToolBar1.add(botaoRecortar);

        botaoRun.setBackground(new java.awt.Color(218, 218, 240));
        botaoRun.setIcon(new javax.swing.ImageIcon(getClass().getResource("/compilador/resources/Play1Hot_32.png"))); // NOI18N
        botaoRun.setToolTipText("Realiza a análise léxica do documento atual");
        botaoRun.setBorderPainted(false);
        botaoRun.setFocusable(false);
        botaoRun.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        botaoRun.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        botaoRun.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botaoRunActionPerformed(evt);
            }
        });
        jToolBar1.add(botaoRun);

        botaoParar.setBackground(new java.awt.Color(218, 218, 240));
        botaoParar.setIcon(new javax.swing.ImageIcon(getClass().getResource("/compilador/resources/delete.png"))); // NOI18N
        botaoParar.setToolTipText("Interrompe a execução da análise léxica");
        botaoParar.setBorderPainted(false);
        botaoParar.setFocusable(false);
        botaoParar.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        botaoParar.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        jToolBar1.add(botaoParar);

        botaoComentar.setBackground(new java.awt.Color(218, 218, 240));
        botaoComentar.setIcon(new javax.swing.ImageIcon(getClass().getResource("/compilador/resources/comment.png"))); // NOI18N
        botaoComentar.setToolTipText("Comenta texto selecionado");
        botaoComentar.setBorderPainted(false);
        botaoComentar.setFocusable(false);
        botaoComentar.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        botaoComentar.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        botaoComentar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botaoComentarActionPerformed(evt);
            }
        });
        jToolBar1.add(botaoComentar);

        jToolBar2.setBackground(new java.awt.Color(218, 218, 240));
        jToolBar2.setBorder(javax.swing.BorderFactory.createEmptyBorder(1, 1, 1, 1));
        jToolBar2.setRollover(true);
        jToolBar2.setBorderPainted(false);

        javax.swing.GroupLayout painelMenusLayout = new javax.swing.GroupLayout(painelMenus);
        painelMenus.setLayout(painelMenusLayout);
        painelMenusLayout.setHorizontalGroup(
            painelMenusLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, painelMenusLayout.createSequentialGroup()
                .addComponent(jToolBar1, javax.swing.GroupLayout.PREFERRED_SIZE, 483, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addComponent(jToolBar2, javax.swing.GroupLayout.PREFERRED_SIZE, 192, javax.swing.GroupLayout.PREFERRED_SIZE))
        );
        painelMenusLayout.setVerticalGroup(
            painelMenusLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jToolBar2, javax.swing.GroupLayout.PREFERRED_SIZE, 32, javax.swing.GroupLayout.PREFERRED_SIZE)
            .addComponent(jToolBar1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
        );

        jMenu1.setText("Arquivo");

        sair.setText("Sair");
        sair.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                sairActionPerformed(evt);
            }
        });
        jMenu1.add(sair);

        jMenuBar1.add(jMenu1);

        setJMenuBar(jMenuBar1);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(painelMenus, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addComponent(painelMenus, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(336, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

    private void botaoRunActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botaoRunActionPerformed
        tokensSintatico = new ArrayList<Token>();
        Scanner.getScanner().setTexto(painel.getAreaTexto().getText()); //atribui texto da tela principal ao objeto scanner

        AnalisadorLexico analex = new AnalisadorLexico(); //instancia um analisador lexico
         
        ArrayList arrayIdent, arrayDelim, arrayOps, arrayComent, arrayNums, arrayReserv, arrayErros = new ArrayList();
        analex.preencherEstruturas();
        //instancia novos arrays para recuperação de dados e preenche estruturas do analisador


        telinha.getAreaErros().setText(""); //limpa painel de erros

        DefaultTableModel model = (DefaultTableModel) telinha.getTabelaSimbolos().getModel(); //recupera model da tabela de símbolos


        model.setRowCount(0); //reseta model da tabela de símbolos, anulando todas as linhas presentes

        //atribui valores retornados pela análise léxica aos arrays criados acima e os exibe na tabela de símbolos
        if (analex.getIdentificadores().size() != 0) {
            arrayIdent = analex.getIdentificadores();
            setTabelaSimbolos(arrayIdent, "IDENTIFICADORES");
        }

        if (analex.getDelimitadores().size() != 0) {
            arrayDelim = analex.getDelimitadores();
            setTabelaSimbolos(arrayDelim, "DELIMITADORES");
        }

        if (analex.getOperadores().size() != 0) {
            arrayOps = analex.getOperadores();
            setTabelaSimbolos(arrayOps, "OPERADORES");
        }

        if (analex.getComentarios().size() != 0) {
            arrayComent = analex.getComentarios();
            setTabelaSimbolos(arrayComent, "COMENTÁRIOS");
        }

        if (analex.getNumeros().size() != 0) {
            arrayNums = analex.getNumeros();
            setTabelaSimbolos(arrayNums, "NÚMEROS");
        }

        if (analex.getPalavrasReservadas().size() != 0) {
            arrayReserv = analex.getPalavrasReservadas();
            setTabelaSimbolos(arrayReserv, "PALAVRAS RESERVADAS");
        }

        //atribui dados à tabela de erros
        arrayErros = analex.getListaErros();
        setTabelaErros(arrayErros);

        //atribui dados à matriz de ocorrência
        ArrayList<ArrayList<Token>> tokens = new ArrayList<ArrayList<Token>>();
        tokens = analex.getMatrizOcorrencia();
        setMatrizOcorrencia(tokens);
        telinha.setVisible(true);


        SintaticoGeral sint = new SintaticoGeral();
         sint.setTokensRecebidos(tokensSintatico);
         sint.program();

         if (sint.getErroSint()!=null) {
             System.out.println("erro que deu sintático" + sint.getErroSint().messagemErro());
         }
    }//GEN-LAST:event_botaoRunActionPerformed

    private void botaoNovoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botaoNovoActionPerformed
        painel.getAreaTexto().setText(""); //reseta texto presente no painel principal
        painel.repaint();
        repaint();
    }//GEN-LAST:event_botaoNovoActionPerformed

    private void botaoAbrirActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botaoAbrirActionPerformed
        JFileChooser jfile = new JFileChooser(); //abre aba de seleção de arquivo de texto
        jfile.showOpenDialog(null);
        fonte = new File(jfile.getSelectedFile().getPath()); //cria um novo arquivo com base no path selecionado

        lerArquivo(fonte); //lê dados do arquivo 

    }//GEN-LAST:event_botaoAbrirActionPerformed

    private void botaoTabelaSimbolosActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botaoTabelaSimbolosActionPerformed
        //exibe ou oculta painel das saídas do programa
        if (telinha.isVisible()) {
            telinha.setVisible(false);
        } else {
            telinha.setVisible(true);
        }
    }//GEN-LAST:event_botaoTabelaSimbolosActionPerformed

    private void sairActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_sairActionPerformed
        System.exit(1); //fecha o sistema
    }//GEN-LAST:event_sairActionPerformed

    private void botaoCopiarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botaoCopiarActionPerformed
        painel.getAreaTexto().copy(); //copia texto
        painel.ajustaLinhas(); //ajusta régua de linhas

    }//GEN-LAST:event_botaoCopiarActionPerformed

    private void botaoColarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botaoColarActionPerformed
        painel.getAreaTexto().paste(); //cola texto
        painel.ajustaLinhas(); //ajusta régua de linhas

    }//GEN-LAST:event_botaoColarActionPerformed

    private void botaoRecortarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botaoRecortarActionPerformed
        painel.getAreaTexto().cut(); //recorta texto
        painel.ajustaLinhas(); //ajusta régua de linhas
    }//GEN-LAST:event_botaoRecortarActionPerformed

    private void botaoComentarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botaoComentarActionPerformed
        comentar(); //chama função de comentar texto selecionado

    }//GEN-LAST:event_botaoComentarActionPerformed

    private void setTabelaSimbolos(ArrayList<Token> tokens, String grupo) {
        String lexs = "";

        DefaultTableModel model = (DefaultTableModel) telinha.TabelaSimbolos.getModel(); //recupera model da tabela de símbolos

        for (int i = 0; i < tokens.size(); i++) {
            lexs = lexs + "   " + tokens.get(i).getLexema(); //concatena lexemas do mesmo grupo em uma mesma string
        }

        String vet[] = {lexs, grupo}; //cria vetor com string concatenada e grupo

        model.addRow(vet); //adiciona vetor à tabela de símbolos


    }

    private void setTabelaErros(ArrayList<Erro> erros) {
        telinha.getAreaErros().setText(""); //limpa texto da tabela de erros

        StyledDocument doc = telinha.getAreaErros().getStyledDocument(); //recupera estilo do painel de erros
        javax.swing.text.Style style = telinha.getAreaErros().addStyle("Red", null); //adiciona estilo ao painel de texto
        StyleConstants.setForeground(style, Color.red); //atribui cor vermelha ao estilo

        style = telinha.getAreaErros().addStyle("Green", null); //adiciona estilo ao painel de texto
        StyleConstants.setForeground(style, Color.BLUE); //atribui cor vermelha ao estilo

        String str = "";

        if (erros.size() == 0) {
            str = "Análise Léxica realizada com sucesso. Sem ocorrência de erros";
            telinha.getAreaErros().setText(str); //atribui texto ao painel de erros
            doc.setCharacterAttributes(0, str.length(), telinha.getAreaErros().getStyle("Green"), true); //seta estilo vermelho ao painel de erros
            JOptionPane.showMessageDialog(null, "Análise Léxica realizada com sucesso. Sem ocorrência de erros", "Sucesso", JOptionPane.INFORMATION_MESSAGE);
        } else {
            for (int i = 0; i < erros.size(); i++) { //varre vetor de erros e o imprime concatenado com trechos de string
                str = " --> Erro encontrado na palavra " + erros.get(i).getPalavraErrada() + " do tipo " + erros.get(i).getTipoErro() + " na linha " + erros.get(i).getLinhaErro() + "\n" + str;
            }


            telinha.getAreaErros().setText(str); //atribui texto ao painel de erros
            doc.setCharacterAttributes(0, str.length(), telinha.getAreaErros().getStyle("Red"), true); //seta estilo vermelho ao painel de erros
        }
        telinha.repaint();
    }

    public void lerArquivo(File fonte) {

        FileReader reader = null;
        try {
            reader = new FileReader(new File(fonte.getAbsolutePath())); //cria reader com base no path passado
        } catch (FileNotFoundException ex) { //trata erros inerentes à abertura e criação de reader com base no path
            Logger.getLogger(MainFrame.class.getName()).log(Level.SEVERE, null, ex);
        }

        BufferedReader buff = new BufferedReader(reader); //cria um buffered reader
        String texto = "";
        String separador = System.getProperty("line.separator"); //cria um separador baseado na quebra de linhas

        try {
            while (buff.ready()) {
                texto = buff.readLine() + separador + texto; //string texto recebe texto devolvido pela leitura de linhas e separador
            }
        } catch (IOException ex) {
            Logger.getLogger(MainFrame.class.getName()).log(Level.SEVERE, null, ex);
        }

        painel.getAreaTexto().setText(texto); //atribui texto ao painel principal
        painel.ajustaLinhas(); //ajusta régua de linhas 
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {

            public void run() {
                new MainFrame().setVisible(true);
            }
        });
    }

    public void setarFullScreen() {
        Insets in = Toolkit.getDefaultToolkit().getScreenInsets(this.getGraphicsConfiguration()); //recupera aspectos gráficos do ambiente

        Dimension d = Toolkit.getDefaultToolkit().getScreenSize(); //recupera dimensão do ambiente

        int width = d.width - (in.left + in.top);
        int height = d.height - (in.top + in.bottom);
        setSize(width, height); //calcula dimensões de tela cheia e atribui ao programa
        setLocation(in.left, in.top); //posiciona frame em tela cheia para evitar que haja perda das laterais
    }

    public void ajustaAmbiente() {


        painel = new PainelCodigo(this.getSize()); //instancia novo painel de código
        this.add(painel); //adiciona painel ao frame principal
        painel.setLocation(0, painelMenus.getHeight()); //posiciona frame principal na tela

        repaint();


        telinha = new TelaSaida(); //instancia nova tela para saída de dados

        telinha.setLocation(this.getWidth() - 1020, painelMenus.getHeight()); //posiciona tela de saída em relação ao frame principal
        telinha.setVisible(true);


    }
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton botaoAbrir;
    private javax.swing.JButton botaoColar;
    private javax.swing.JButton botaoComentar;
    private javax.swing.JButton botaoCopiar;
    private javax.swing.JButton botaoNovo;
    private javax.swing.JButton botaoParar;
    private javax.swing.JButton botaoRecortar;
    private javax.swing.JButton botaoRun;
    private javax.swing.JButton botaoTabelaSimbolos;
    private javax.swing.JMenu jMenu1;
    private javax.swing.JMenuBar jMenuBar1;
    private javax.swing.JToolBar jToolBar1;
    private javax.swing.JToolBar jToolBar2;
    private javax.swing.JPanel painelMenus;
    private javax.swing.JMenuItem sair;
    // End of variables declaration//GEN-END:variables

    private void comentar() {
        if (painel.getAreaTexto().getSelectedText() != null) { //checa se há texto selecionado
            String subs = painel.getAreaTexto().getSelectedText(); //recupera texto seleciona
            System.out.println(subs + "subs");

            String aux = new String(subs.toString()); //cria uma string auxiliar
            subs = "/*" + subs + "*/"; //concatena marcadores de comentário à string subs selecionada anteriormente

            String texto = painel.getAreaTexto().getText();
            String[] coment = (texto.split(aux)); //cria um vetor com texto principal dividido com base no valor inicial da string selecionada

            String fim = coment[0] + subs + coment[1]; //concatena posições do vetor com string selecionada no meio

            painel.getAreaTexto().setText(fim); //atribui string resultante (com texto comentado no meio) ao painel de texto
        }
    }

    private void setMatrizOcorrencia(ArrayList<ArrayList<Token>> tokens) {
        String lexs = "";
        String[] vet = new String[2];

        DefaultTableModel ocorr = (DefaultTableModel) telinha.getMatrizOcorrencia().getModel(); //recupera model da matriz de ocorrência

        ocorr.setRowCount(0); //reseta model apagando suas linhas


        for (int z = 0; z < tokens.size(); z++) {
            for (int j = 0; j < tokens.get(z).size(); j++) {
                lexs = lexs + " " + tokens.get(z).get(j).getLexema(); //concatena lexemas que estão na mesma linha
                tokensSintatico.add(tokens.get(z).get(j));
            }

            vet[0] = lexs;
            vet[1] = "Linha " + (z + 1); //cria vetor com referência de linha e string concatenada anteriormente
            ocorr.addRow(vet); //adiciona vetor ao model
            lexs = ""; //reseta string concatenada
        }


        telinha.repaint();
    }
}
